﻿/*
 * Created by SharpDevelop.
 * User: XPMUser
 * Date: 11/03/2011
 * Time: 11:49
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;

namespace KDG.FoldersSize4
{
	/// <summary>
	/// Description of FileSizeFormatProvider.
	/// </summary>
	public class FileSizeFormatProvider : IFormatProvider, ICustomFormatter
	{
	    public object GetFormat(Type formatType)
	    {
	        if (formatType == typeof(ICustomFormatter)) return this;
	        return null;
	    }
	
	    private const string fileSizeFormat = "fs";
	    private const Decimal OneKiloByte = 1024M;
	    private const Decimal OneMegaByte = OneKiloByte * 1024M;
	    private const Decimal OneGigaByte = OneMegaByte * 1024M;
	
	    public string Format(string format, object arg, IFormatProvider formatProvider)
	    {    
	        if (format == null || !format.StartsWith(fileSizeFormat))    
	        {    
	            return defaultFormat(format, arg, formatProvider);    
	        }
	
	        if (arg is string)    
	        {    
	            return defaultFormat(format, arg, formatProvider);    
	        }
	
	        Decimal size;
	
	        try    
	        {    
	            size = Convert.ToDecimal(arg);    
	        }    
	        catch (InvalidCastException)    
	        {    
	            return defaultFormat(format, arg, formatProvider);    
	        }
	
	        string suffix;
	        if (size > OneGigaByte)
	        {
	            size /= OneGigaByte;
	            suffix = "GB";
	        }
	        else if (size > OneMegaByte)
	        {
	            size /= OneMegaByte;
	            suffix = "MB";
	        }
	        else if (size > OneKiloByte)
	        {
	            size /= OneKiloByte;
	            suffix = "kB";
	        }
	        else
	        {
	            suffix = " B";
	        }
	
	        string precision = format.Substring(2);
	        if (String.IsNullOrEmpty(precision)) precision = "2";
	        return String.Format("{0:N" + precision + "}{1}", size, suffix);
	
	    }
	
	    private static string defaultFormat(string format, object arg, IFormatProvider formatProvider)
	    {
	        IFormattable formattableArg = arg as IFormattable;
	        if (formattableArg != null)
	        {
	            return formattableArg.ToString(format, formatProvider);
	        }
	        return arg.ToString();
	    }

	}
}
